<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Reflect</title>
  <style>
    body {
      padding: 20px;
    }
    div, li, p {
      line-height: 40px;
    }
    span {
      color: red;
    }
  </style>
</head>
<body>
  <h3>Reflect对象设计的目的</h3>
  <ul>
    <li>
      将Object对象的一些明显属于语言内部的方法放到Reflect对象上.现阶段,某些方法同时在Object和Reflect对象上部署.将来的新方法将只在Reflect上部署
    </li>
    <li>
      修改某些Object方法返回的结果,让其变得更合理
    </li>
    <li>
      Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应方法. <span>也就是说,无论Proxy怎么修改默认行为,我们总可以在Reflect上获取默认行为</span>  
    </li>
    <li>让Object操作<span>特别是命令式</span>都变成函数行为.</li>
  </ul>
  <h2>静态方法</h2>
  <ul>
    <li>
      Reflect.get(target, name, receiver) : 查找并返回target对象的name属性,如果没有该属性,则返回undefined,如果name属性部署了读取函数getter,则读取函数的this,并将this绑定到receiver.如果name属性没有读取函数getter,那么函数的this指向原对象
    </li>
    <li>
      Reflect.set(target, name, value, receiver): 设置targrt对象的name属性等于value.如果name属性设置了赋值函数setter,则赋值函数的this绑定reveiver. <span>Reflect.set会触发Proxy.defineProperty</span>
    </li>
    <li>
      Reflect.has(obj, name): 对应name in obj 中的in运算符
    </li>
    <li>
      Reflect.deleteProperty(obj, name): 用于删除对象属性,等同于delete obj[name]
    </li>
    <li>
      Reflect.constructor(target, args): 方法提供了一种不使用new来调用构造函数的方法
    </li>
    <li>
      Reflect.getPrototypeOf(obj):方法用于读取对象的__proto__属性,对应Object.getPrototypeOf(obj)
    </li>
    <li>
      Reflect.setPrototypeOf(obj, newPro):设置一个对象的__proto__属性,返回布尔值
    </li>
    <li>
      Reflect.apply(target, ctx, argunemtsList): 通过指定的参数列表发起对目标(target)函数的调用.返回值是 将 ctx作为上下文(this指向),argunemtsList作为参数,执行target函数的返回结果
      <ul>
        <li>targrt: 目标函数</li>
        <li>ctx: target函数调用时绑定的this对象</li>
        <li>argunemtsList: target函数调用时传入的实参列表,该参数应该是一个类数组对象</li>
      </ul>
    </li>
    <li>
      Reflect.defineProperty(target, key, options): 基本等同于Object.defineProperty,用来为对象定义属性.今后,后者<span>将被逐渐废除</span>,因此从现在开始请使用Reflect.defineProperty来代替它
    </li>
    <li>
      Reflect.getOwnPropertyDescriptor(target, key): 获取指定属性的描述对象
    </li>
    <li>
      Reflect.isExtensible(target): 返回一个布尔值,表示当前对象是否可扩展
    </li>
    <li>
      Reflect.preventExtensions(target): 用于使一个对象变为不可扩展的,返回一个布尔值,表示是否操作成功
    </li>
    <li>
      Reflect.ownKeys(target): 用于返回对象的所有属性.<span>(可枚举属性和Symbol类型之和)</span>
    </li>
  </ul>
  <h3>使用Proxy实现观察者模式</h3>
  <p>
    观察者模式指的是函数自动观察数据对象的模式,一旦对象有变化,函数就会自动执行.
  </p>
</body>
</html>